package it.univaq.mwt.arssa.presentation.backoffice.attivita;

import it.univaq.mwt.arssa.business.ArssaBusinessFactory;
import it.univaq.mwt.arssa.business.AttivitaService;
import it.univaq.mwt.arssa.business.RuoliService;
import it.univaq.mwt.arssa.business.model.Attivita;
import it.univaq.mwt.arssa.business.model.Ruolo;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.MappingDispatchAction;

public class AttivitaAction extends MappingDispatchAction {

	public ActionForward visualizzaattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
				
		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();
		AttivitaService attivitaService = factory.getAttivitaService();			
		
		//setto i dati per far visualizzare la lista delle attivita
		List<Attivita> attivita = attivitaService.cercaAttivita(); // popolo la lista 
		request.setAttribute("attivita", attivita);
				
		return mapping.findForward("admin.visualizza.attivita");

	}
	
	public ActionForward activeadminmodificaattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();
		AttivitaService attivitaService = factory.getAttivitaService();
		RuoliService ruoliService = factory.getRuoliService();
					
		int id = Integer.parseInt(request.getParameter("id"));
		Attivita attivita = attivitaService.cercaAttivita(id);
		AttivitaForm attivitaForm = (AttivitaForm) form;
		BeanUtils.copyProperties(attivitaForm, attivita); // copio tutti i parametri nella form
				
		request.setAttribute("titoloForm", "Modifica attivit&agrave;"); // setto il titolo della form
		request.setAttribute("action", "/admin/attivita/modificaattivita"); // setto la action
		
		List<Ruolo> ruoli = ruoliService.cercaRuoli();
		request.setAttribute("ruoli", ruoli);
		
		List<Attivita> attivitaresult = attivitaService.cercaAttivita(); // popolo la lista delle attivita
		request.setAttribute("attivita", attivitaresult);
		request.setAttribute("id", id);
		
		saveToken(request);
		
		return mapping.findForward("admin.attivita.form");	
	}
	
	public ActionForward adminmodificaattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();
		AttivitaService attivitaService = factory.getAttivitaService();
		RuoliService ruoliService = factory.getRuoliService();
				
		request.setAttribute("titoloForm", "Modifica attivit&agrave;"); // setto il titolo della form per attivita.result
				
		
		if (!isTokenValid(request, false)) {
			// setto gli errori
			request.setAttribute("errore", 1); // setto la tipologia di errore/successo
			request.setAttribute("msg", "Errore double submit"); // setto il messaggio
			return mapping.findForward("admin.attivita.result");
		}
				
		AttivitaForm attivitaForm = (AttivitaForm) form;
		int id = attivitaForm.getId();
		String nome = attivitaForm.getNome();
		int idRuolo = attivitaForm.getRuolo();
		
		Ruolo ruolo = ruoliService.cercaRuolo(idRuolo);
		Attivita attivita = new Attivita(id, nome, ruolo);
		
		//modifico l'attivita
		attivitaService.modificaAttivita(attivita);
		
		// se arrivo qui,non ho ricevuto errori 
		request.setAttribute("errore", 0); // setto la tipologia di successo
		request.setAttribute("msg", "Modifica avvenuta con successo"); // setto il messaggio
		// popolo le select di visualizzazione di tutte le attivita
		request.setAttribute("attivita", attivitaService.cercaAttivita());  // popolo la lista delle attivita
		
		resetToken(request);
		
		return mapping.findForward("admin.attivita.result");	
	}
	
	public ActionForward activeadmininserisciattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	throws Exception {
		
		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();		
		RuoliService ruoliService = factory.getRuoliService();
		AttivitaService attivitaService = factory.getAttivitaService();
		
		request.setAttribute("titoloForm", "Inserisci Attivit&agrave;"); // setto il titolo della form
		request.setAttribute("action", "/admin/attivita/inserisciattivita"); // setto la action	
		
		// popolo le select di visualizzazione di tutte le attivita
		request.setAttribute("ruoli", ruoliService.cercaRuoli());	
		// popolo le select di visualizzazione di tutte le attivita
		request.setAttribute("attivita", attivitaService.cercaAttivita()); // popolo la lista delle attivita
				
		saveToken(request);
		
		return mapping.findForward("admin.attivita.form"); 
	}
	
	public ActionForward admininserisciattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	throws Exception {
		
		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();
		AttivitaService attivitaService = factory.getAttivitaService();
		RuoliService ruoliService = factory.getRuoliService();
			
		/* 
		 * Controllo tutti gli errori possibili dovuti all'inserimento (double submit,etc etc)
		 */
		if (!isTokenValid(request, false)) {
			// setto gli errori
			request.setAttribute("errore", 1); // setto la tipologia di errore/successo
			request.setAttribute("msg", "Errore double submit"); // setto il messaggio
			return mapping.findForward("admin.attivita.result");
		}
		
		AttivitaForm attivitaForm = (AttivitaForm) form;
		String nome = attivitaForm.getNome();
		int idRuolo = attivitaForm.getRuolo();
		
		Ruolo ruolo = ruoliService.cercaRuolo(idRuolo);
		
		// popolo le select di visualizzazione di tutte le attivita
		request.setAttribute("ruoli", ruoliService.cercaRuoli());	
		request.setAttribute("titoloForm", "Inserisci Attivit&agrave;"); // setto il titolo della form
		request.setAttribute("action", "/admin/attivita/inserisciattivita"); // setto la action
				
		if(attivitaService.cercaAttivita(nome, idRuolo)){
			request.setAttribute("erroreDuplicazione", 1);
			request.setAttribute("descrizioneDuplicazione", "Attivit&agrave; gi&agrave; presente nel db.");
			request.setAttribute("attivita", attivitaService.cercaAttivita());  // popolo la lista delle attivita
			return mapping.findForward("admin.attivita.form");
		}
		
		List<Attivita> attivitaRicerca = attivitaService.cercaAttivita(nome);
		
		if( attivitaRicerca.size()==1 ){	
			request.setAttribute("erroreDuplicazione", 1);
			request.setAttribute("descrizioneDuplicazione", "Nome attivit&agrave; gi&agrave; presente nel db.");
			request.setAttribute("attivita", attivitaService.cercaAttivita());  // popolo la lista delle attivita
			return mapping.findForward("admin.attivita.form");
		}
		
		Attivita attivita = new Attivita(0, nome, ruolo);
		attivitaService.inserisciAttivita(attivita);

		// se arrivo qui,non ho ricevuto errori 
		request.setAttribute("errore", 0); // setto la tipologia di successo
		request.setAttribute("msg", "Inserimento avvenuto con successo"); // setto il messaggio
		
		// popolo le select di visualizzazione di tutte le attivita 
		request.setAttribute("attivita", attivitaService.cercaAttivita());  // popolo la lista delle attivita
		
		resetToken(request);
		
		return mapping.findForward("admin.attivita.result");
	}
	
	
	public ActionForward activeadmineliminaattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();
		AttivitaService attivitaService = factory.getAttivitaService();
		
		int idAttivita = Integer.parseInt(request.getParameter("id"));
		Attivita attivita = attivitaService.cercaAttivita(idAttivita);
		
		request.setAttribute("id", idAttivita);
		request.setAttribute("attivita", attivita);
		request.setAttribute("titoloForm", "Eliminare la seguente attivita?"); // setto il titolo della form
		request.setAttribute("action", "/admin/attivita/eliminaattivita"); // setto la action
		
		saveToken(request);
		
		return mapping.findForward("admin.elimina.attivita.form");
		
	}
	
	public ActionForward admineliminaattivita(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	throws Exception {
		
		ArssaBusinessFactory factory = ArssaBusinessFactory.getInstance();
		AttivitaService attivitaService = factory.getAttivitaService();
	
		request.setAttribute("titoloForm", "Elimina la tua attivita"); // setto il titolo della form 
			
		/* 
		 * Controllo tutti gli errori possibili dovuti all'inserimento (double submit,etc etc)
		 */
		if (!isTokenValid(request, false)) {
			// setto gli errori
			request.setAttribute("errore", 1); // setto la tipologia di errore/successo
			request.setAttribute("msg", "Errore double submit"); // setto il messaggio
			return mapping.findForward("admin.attivita.result");
		}
		
		AttivitaForm attivitaForm = (AttivitaForm) form;
		int idAttivita = attivitaForm.getId();
		attivitaService.eliminaAttivita(idAttivita);
				
		request.setAttribute("errore", 0); // setto la tipologia di successo
		request.setAttribute("msg", "Attivita eliminata correttamente"); // setto il messaggio 
		request.setAttribute("attivita", attivitaService.cercaAttivita());  // popolo la lista delle attivita
		
		resetToken(request);
		
		return mapping.findForward("admin.attivita.result");
	
	}
	
	
}
